package com.example.demo.leetcode.classics150;

/**
 * ******************************************************
 *
 * @author liugh9
 * @version 1.0
 * @classname _98实现Trie前缀树
 * @description
 * @date 2023/08/09 14:44
 * <p>
 * ******************************************************
 */
public class _98实现Trie前缀树 {

    class TrieNode {
        // 单词结尾
        boolean val;
        // 该层下层的26中情况
        TrieNode[] children = new TrieNode[26];
    }

    private TrieNode root;


    public _98实现Trie前缀树() {
        root = new TrieNode();
    }


    // 向前缀树中插入字符串 word 。
    void insert(String word) {
        TrieNode p = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (p.children[c - 'a'] == null) p.children[c -'a'] = new TrieNode();
            p = p.children[c -'a'];
        }
        p.val = true;
    }

    // 如果字符串 word 在前缀树中，返回 true（即，在检索之前已经插入）；否则，返回 false 。
    boolean search(String word) {
        TrieNode p = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (p.children[c - 'a'] == null) return false;
            p = p.children[c -'a'];
        }
        return p.val;
    }

    //如果之前已经插入的字符串 word 的前缀之一为 prefix ，返回 true ；否则，返回 false 。
    boolean startsWith(String prefix) {
        TrieNode p = root;
        for (int i = 0; i < prefix.length(); i++) {
            char c = prefix.charAt(i);
            if (p.children[c - 'a'] == null) return false;
            p = p.children[c -'a'];
        }
        return true;
    }
}
